# 嵌套依赖: 这么个拆分组合式 比 SQL 存储过程 或者 多个 service 更好？比 .then().then() [fn1,fn2] 更好？
# 我看不见得，一个逻辑链条 得到处找依赖 而且不确定之前的依赖之间，都 return 了什么样的数据参数
# 一个大逻辑拆分成若干小逻辑，不放到一起，看起来不费劲？放到一起还拆个毛线？
# 虽然拆分组合越细致可复用越多，但是和数据库设计一样，很多时候宁可冗余字段也不要join
# 改一个地方 相同依赖的地方都改了 维护起来更方便？也不见得吧，没听说 Bug 是改一个多十个，越改越多？

from fastapi import FastAPI, Depends, HTTPException

app = FastAPI()


# 子依赖：模拟获取当前用户
def get_current_user(user_id: int):
    if user_id != 1:  # 假设只有 user_id 为 1 的用户是有效的
        raise HTTPException(status_code=400, detail="User not found")
    return {"user_id": user_id, "username": "example_user"}


# 子依赖：模拟获取用户的角色
def get_current_user_role(user: dict = Depends(get_current_user)):  # {"user_id": user_id, "username": "example_user"}
    # 在这里可以根据用户信息查询角色
    return {"user_id": user["user_id"], "role": "admin"}


# 主依赖：在多个路径操作中使用
@app.get("/users/me")
async def read_users_me(role: dict = Depends(get_current_user_role)):  # {"user_id": user["user_id"], "role": "admin"}
    return {"role": role["role"],
            "message": "This is your profile"}  # {"role": "admin","message": "This is your profile"}


@app.get("/admin")
async def read_admin_data(role: dict = Depends(get_current_user_role)):
    if role["role"] != "admin":
        raise HTTPException(status_code=403, detail="You do not have access to this resource")
    return {"message": "Welcome to the admin page"}
